using System.Numerics;

namespace rfid9500_Mqtt;

/// <summary>
/// 解析并打印协议。
/// </summary>
public class Jiexi
{
    /// <summary>
    /// 将十六进制字符串转换为字节数组。
    /// </summary>
    /// <param name="hex">待转换的十六进制字符串。</param>
    /// <returns>转换后的字节数组。</returns>
    public static byte[] HexStringToByteArray(string hex)
    {
        // 计算十六进制字符串的长度
        int numberChars = hex.Length;

        // 初始化字节数组，长度为十六进制字符串长度的一半
        byte[] bytes = new byte[numberChars / 2];

        // 遍历十六进制字符串，每两个字符转换为一个字节
        for (int i = 0; i < numberChars; i += 2)
        {
            // 使用Substring方法提取两个字符，并使用Convert.ToByte将其转换为字节
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        }

        // 返回转换后的字节数组
        return bytes;
    }

    public static String  ParseAndPrintProtocol(byte[] bytes)
    {
        if (bytes.Length < 7) // 最小长度检查
        {
            Console.WriteLine("Error: Packet is too short.");
            return "";
        }

        // 解析各个字段
        byte SOI = bytes[0];
        ushort ADR = (ushort)((bytes[2] << 8) | bytes[1]); // 地址高位在后,低位在前
        byte CID1 = bytes[3];
        byte RTN = bytes[4];
        byte LENGTH = bytes[5];
        byte ANT = bytes[6];
        byte RSSI = bytes[LENGTH + 5];
        byte[] PC = new byte[2] { bytes[7], bytes[8] };
        byte[] INFO = new byte[LENGTH - 4 - 8];
        byte[] INFO2 = new byte[LENGTH];
        Array.Copy(bytes, 6, INFO2, 0, LENGTH);
        Array.Copy(bytes, 6 + 3 + 8, INFO, 0, LENGTH - 4 - 8);

        byte CHKSUM = bytes[6 + LENGTH];
        BigInteger number1 = new BigInteger(INFO);
        Array.Reverse(INFO);
        BigInteger number2 = new BigInteger(INFO);
        // 打印解析结果
        // Console.WriteLine(
        //     "SOI: 0x{0:X2} ({1})",
        //     SOI,
        //     SOI == 0x7C ? "命令"
        //         : SOI == 0xCC ? "响应"
        //         : "未知"
        // );
        // Console.WriteLine("ADR: {0} (0x{0:X4})", ADR);
        // Console.WriteLine("CID1: 0x{0:X2}", CID1);
        // Console.WriteLine("RTN: 0x{0:X2}", RTN);
        // Console.WriteLine("ANT: 0x{0:X2}", ANT);
        // Console.WriteLine("PC: 0x{0:X2} 0x{1:X2}", PC[0], PC[1]);

        // Console.WriteLine("LENGTH: {0}", LENGTH);

        // Console.WriteLine("RSSI: 0x{0:X2}", RSSI);

        // Console.WriteLine("INFO: " + BitConverter.ToString(INFO2).Replace("-", " "));
        // Console.WriteLine("EPC: " + BitConverter.ToString(INFO).Replace("-", " "));
        Console.WriteLine("ID: " + number1);
        Console.WriteLine("ID2: " + number2);
        // Console.WriteLine("CHKSUM: 0x{0:X2}", CHKSUM);
        // Console.WriteLine("Total length {0}", bytes.Length);
        // // 额外：验证校验和（假设校验和是所有字节的累加和）
        // byte calculatedChecksum = CalculateChecksum(bytes, LENGTH);
        // Console.WriteLine("Calculated CHKSUM: 0x{0:X2}", calculatedChecksum);
        // Console.WriteLine("Checksum Valid: {0}", CHKSUM == calculatedChecksum);
        return number2.ToString();
    }

    public static byte CalculateChecksum(byte[] bytes, byte length)
    {
        byte checksum = 0;
        for (int i = 0; i <= length + 5; i++) // 包括前面的固定部分和INFO部分
        {
            checksum += bytes[i];
        }
        // 模 256 后取反加 1
        checksum = (byte)(~(checksum % 256) + 1);

        return checksum;
    }
}
